﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using DA_OOMModel;
using System.Data;
using DA_OOMNHibernateDAL;
using DA_OOMDALFactory;
using DA_OOMModelIDAL;
using System.Reflection;
using System.Collections;

namespace DaCredito
{
    public partial class CadastroCliente :  WebPageGridForm
    {

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);


            if (!ScriptManager1.IsInAsyncPostBack)
            {
                this.CarregaEstados();
            }

            //base.Page_Load(sender, e);


            if (!ScriptManager1.IsInAsyncPostBack)
            {
                this.CarregaCidades();
            }
            
        }
        protected override void PrePageLoad()
        {

            base.PrePageLoad();

            this.ioTipoEntidade = typeof(Pessoa);
            this.ioTipoPKEntidade = typeof(PessoaPK);
            this.ioListaTipoEntidadeSecundaria = new Type[5] {typeof(PessoaJuridica), typeof(Cliente), typeof(Usuario), typeof(Endereco), typeof(Telefone)};
            this.isNomeAtributos = new string[2] { "PesIdPessoa", "PesNmPessoa" };
            this.isNomeAtributoOrdenacao = "PES_NM_PESSOA";
            
        }


        protected void Page_Load(object sender, EventArgs e)
        {



            if (!ScriptManager1.IsInAsyncPostBack)
            {
                this.CarregaEstados();
            }


            if (!ScriptManager1.IsInAsyncPostBack)
            {
                this.CarregaCidades();
            }
            
            
        }
        protected override void CarregaEntidadesPagina()
        {

            Pessoa loPessoa = (Pessoa)ioInstanciaEntidade;


            if (loPessoa.PessoaJuridica.Count > 0)
            {
                IEnumerator ddd = loPessoa.PessoaJuridica.GetEnumerator();
                ddd.MoveNext();
                this.CarregaEntidadePagina(typeof(PessoaJuridica), ddd.Current);
            }

            if (loPessoa.Cliente.Count > 0)
            {
                IEnumerator ddd = loPessoa.Cliente.GetEnumerator();
                ddd.MoveNext();

                Cliente loCliente = (Cliente) ddd.Current;

                this.CarregaEntidadePagina(typeof(Cliente), loCliente);

                List<Usuario> loListaUsuarios = ControladorDaCredito.GetInstance().RecuperaListaUsuario(loCliente);
                if (loListaUsuarios.Count > 0)
                {
                    this.CarregaEntidadePagina(typeof(Usuario), loListaUsuarios[0]);
                }

                ContaBancaria loContaBancaria = ControladorDaCredito.GetInstance().RecuperaContaBancariaCliente(loCliente.ClientePK);

                if (loContaBancaria != null)
                {
                    this.CarregaEntidadePagina(typeof(ContaBancaria), loContaBancaria);


                    if (loContaBancaria.Agencia != null)
                    {
                        this.CarregaEntidadePagina(typeof(Agencia), loContaBancaria.Agencia);

                        if (loContaBancaria.Agencia.Banco != null)
                        {
                            this.CarregaEntidadePagina(typeof(Banco), loContaBancaria.Agencia.Banco);
                        }

                    }
                }

            }

           


         



         

            List<Endereco> loListaEnderecos = ControladorDaCredito.GetInstance().RecuperaListaEndereco((Pessoa)ioInstanciaEntidade);
            if (loListaEnderecos.Count > 0)
            {
                this.CarregaEntidadePagina(typeof(Endereco), loListaEnderecos[0]);
            }

            List<Telefone> loListaTelefones = ControladorDaCredito.GetInstance().RecuperaListaTelefone((Pessoa)ioInstanciaEntidade);
            if (loListaTelefones.Count > 0)
            {
                this.CarregaEntidadePagina(typeof(Telefone), loListaTelefones[0]);
            }


        }

        protected void CarregaEstados()
        {
            List<Estado> loListaEstado = ControladorDaCredito.GetInstance().RecuperaListaEstado();

            foreach (Estado loEstado in loListaEstado)
            {
                Column_Estado.Items.Add(new ListItem(loEstado.EstNmEstado, loEstado.EstIdEstado.ToString()));
            }
        }


        protected void CadastrarClienteButton_Click(object sender, EventArgs e)
        {

            this.OnSave();
            return;
             }
        
        protected override bool OnUpdate()
        {

            string lsEmail;
            string lsEnderecoLogradouro;
            string lsEnderecoComplemento;
            string lsEnderecoNumero;
            string lsEnderecoNumeroCep;
            string lsEnderecoNomeBairro;
            
            lsEmail = Column_UsrDsEmail.value;
            lsEnderecoLogradouro = Column_EndNmLogradouro.Text;
            lsEnderecoComplemento = Column_EndDsComplemento.Text;
            lsEnderecoNumero = "";
            lsEnderecoNumeroCep = "";
            lsEnderecoNomeBairro = "";

            int liIdCidade = Convert.ToInt32(Column_Cidade.SelectedValue);
            int liIdEstado = Convert.ToInt32(Column_Estado.SelectedValue);

            Cidade loCidade = new Cidade();
            loCidade.CidadePK = new CidadePK(liIdCidade);

            Estado loEstado = new Estado();
            loEstado.EstadoPK = new EstadoPK(liIdEstado);

            // ---------------------------------
            // Cadastro da Pessoa
            // ---------------------------------
            int liIdPessoa = Column_PesIdPessoa.Value == "" ? 0 : Convert.ToInt32(Column_PesIdPessoa.Value);

            IPessoaDAL loPessoaDAO = ConcreteDALFactory.CreatePessoaDAL();

            Pessoa loPessoa = loPessoaDAO.Load(new PessoaPK(liIdPessoa));
            if (loPessoa == null)
                loPessoa = new Pessoa();

            loPessoa.PesNmPessoa = Column_PesNmPessoa.Text;
            loPessoa.PesNuCpfCnpj = Column_PesNuCpfCnpj.value;
            loPessoa.PesDtCadastro = DateTime.Today;

            // ---------------------------------
            // Cadastro da Pessoa Juridica
            // ---------------------------------
            int liIdPessoaJuridica = Column_PejIdPessoaJuridica.Value == "" ? 0 : Convert.ToInt32(Column_PejIdPessoaJuridica.Value);

            IPessoaJuridicaDAL loPessoaJuridicaDAO = ConcreteDALFactory.CreatePessoaJuridicaDAL();

            PessoaJuridica loPessoaJuridica = loPessoaJuridicaDAO.Load(new PessoaJuridicaPK(liIdPessoaJuridica));
            if (loPessoaJuridica == null)
                loPessoaJuridica = new PessoaJuridica();

            loPessoaJuridica.PejNmRazaoSocial = Column_PejNmRazaoSocial.Text;
            loPessoaJuridica.PejNuInscricaoEstadual = Column_PejNuInscricaoEstadual.Text;
            loPessoaJuridica.PejNuInscricaoMunicipal = Column_PejNuInscricaoMunicipal.Text;
            loPessoaJuridica.Pessoa = loPessoa;

            // ---------------------------------
            // Cadastro do Cliente
            // ---------------------------------
            int liIdCliente = Column_CliIdCliente.Value == "" ? 0 : Convert.ToInt32(Column_CliIdCliente.Value);

            IClienteDAL loClienteDAO = ConcreteDALFactory.CreateClienteDAL();

            Cliente loCliente = loClienteDAO.Load(new ClientePK(liIdCliente));
            if (loCliente == null)
                loCliente = new Cliente();

            loCliente.CliChAtivo = Column_CliChAtivo.Checked;
            loCliente.Pessoa = loPessoa;

            // ---------------------------------
            // Cadastro do Usuario
            // ---------------------------------
            int liIdUsuario = Column_UsrIdUsuario.Value == "" ? 0 : Convert.ToInt32(Column_UsrIdUsuario.Value); 

            IUsuarioDAL loUsuarioDAO = ConcreteDALFactory.CreateUsuarioDAL();

            Usuario loUsuario = loUsuarioDAO.Load(new UsuarioPK(liIdUsuario));
            if (loUsuario == null)
                loUsuario = new Usuario();

            loUsuario.UsrDsEmail = lsEmail;
            loUsuario.UsrDsNickname = Column_UsrDsNickname.Text;
            loUsuario.UsrDsSenha = Column_UsrDsSenha.Text;
            loUsuario.UsrDsNome = "Administrador";
            loUsuario.UsrDsSobrenome = "Administrador";
            loUsuario.Cliente = loCliente;
            
            // ---------------------------------
            // Cadastro do Endereço do cliente
            // ---------------------------------
            int liIdEndereco = Column_EndIdEndereco.Value == "" ? 0 : Convert.ToInt32(Column_EndIdEndereco.Value); 

            IEnderecoDAL loEnderecoDAO = ConcreteDALFactory.CreateEnderecoDAL();

            Endereco loEndereco = loEnderecoDAO.Load(new EnderecoPK(liIdEndereco));
            if (loEndereco == null)
                loEndereco = new Endereco();

            loEndereco.EndNmLogradouro = lsEnderecoLogradouro;
            loEndereco.EndNuCep = lsEnderecoNumeroCep;
            loEndereco.EndNmBairro = lsEnderecoNomeBairro;
            loEndereco.EndNuImovel = lsEnderecoNumero;
            loEndereco.EndDsComplemento = lsEnderecoComplemento;
            loEndereco.Pessoa = loPessoa;
            loEndereco.Cidade = loCidade;
            loEndereco.Estado = loEstado;

            // ---------------------------------
            // Cadastro do Telefone do cliente
            // ---------------------------------
            int liIdTelefone = Column_TelIdTelefone.Value == "" ? 0 : Convert.ToInt32(Column_TelIdTelefone.Value);

            ITelefoneDAL loTelefoneDAO = ConcreteDALFactory.CreateTelefoneDAL();

            Telefone loTelefone = loTelefoneDAO.Load(new TelefonePK(liIdTelefone));
            if (loTelefone == null)
                loTelefone = new Telefone();

            loTelefone.TelCdDdd = Column_TelCdDdd.Text;
            loTelefone.TelNuTelefone = Column_TelNuTelefone.Text;
            loTelefone.Pessoa = loPessoa;

            // ---------------------------------
            // Cadastro do Banco
            // ---------------------------------
            int liIdBanco = Column_BncIdBanco.Value == "" ? 0 : Convert.ToInt32(Column_BncIdBanco.Value);

            IBancoDAL loBancoDAO = ConcreteDALFactory.CreateBancoDAL();

            Banco loBanco = loBancoDAO.Load(new BancoPK(liIdBanco));
            if (loBanco == null)
            {
                loBanco = new Banco();
                loBanco.BncNmBanco = "Banco do Brasil";
                loBanco.BncNuBanco = "001";
                loBanco.BncNuCnpj = "00000000000";
                loBanco.BncNuDigitoBanco = "0";

            }

            // ---------------------------------
            // Cadastro da Agencia
            // ---------------------------------
            int liIdAgencia = Column_AgcIdAgencia.Value == "" ? 0 : Convert.ToInt32(Column_AgcIdAgencia.Value);

            IAgenciaDAL loAgenciaDAO = ConcreteDALFactory.CreateAgenciaDAL();

            Agencia loAgencia = loAgenciaDAO.Load(new AgenciaPK(liIdAgencia));
            if (loAgencia == null)
                loAgencia = new Agencia();

            loAgencia.AgcNuAgencia = Column_AgcNuAgencia.Text;
            loAgencia.AgcNuDigitoAgencia = "0";
            loAgencia.AgcNuCnpj = "00000000000";
            loAgencia.AgcNmAgencia = "00000000000";
            loAgencia.Banco = loBanco;

            // ---------------------------------
            // Cadastro do ContaBancaria
            // ---------------------------------
            int liIdContaBancaria = Column_CnbIdConta.Value == "" ? 0 : Convert.ToInt32(Column_CnbIdConta.Value);

            IContaBancariaDAL loContaBancariaDAO = ConcreteDALFactory.CreateContaBancariaDAL();

            ContaBancaria loContaBancaria = loContaBancariaDAO.Load(new ContaBancariaPK(liIdContaBancaria));
            if (loContaBancaria == null)
                loContaBancaria = new ContaBancaria();

            loContaBancaria.CnbDsConta = "Conta da empresa";
            loContaBancaria.CnbDtAbertura = Convert.ToDateTime(Column_CnbDtAbertura.value);
            loContaBancaria.CnbNuConta = Column_CnbNuConta.Text;
            loContaBancaria.CnbNuDigitoConta = Column_CnbNuDigitoConta.Text;
            loContaBancaria.CnbVlSaldoInicial = Convert.ToDecimal(Column_CnbVlSaldoInicial.value);
            loContaBancaria.CnbTpProprietario = "";
            loContaBancaria.Agencia = loAgencia;

            ControladorDaCredito.GetInstance().CadastrarCliente(loPessoa, loPessoaJuridica, loCliente, loUsuario, loEndereco, loTelefone);
           
        
            return true;
        }
    
        protected void Column_Estado_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.CarregaCidades();
        }

        private void CarregaCidades()
        {
            int liIDEstado = Convert.ToInt32(Column_Estado.Items[Column_Estado.SelectedIndex].Value);

            EstadoPK loEstadoPK = new EstadoPK(liIDEstado);

            List<Cidade> loListaCidade = ControladorDaCredito.GetInstance().RecuperaListaCidade(loEstadoPK);

            Column_Cidade.Items.Clear();
            foreach (Cidade loCidade in loListaCidade)
            {
                Column_Cidade.Items.Add(new ListItem(loCidade.CidNmCidade, loCidade.CidIdCidade.ToString()));
            }

        }
        protected override IList GetListaEntidade(object aoEntidadeDAL)
        {

            IClienteDAL loClienteDAO = ConcreteDALFactory.CreateClienteDAL();
            IList<Cliente> loListaCliente = loClienteDAO.GetClienteList();
            List<Pessoa> loListaPessoa = new List<Pessoa>();
            foreach (Cliente loCliente in loListaCliente)
            {
                loListaPessoa.Add(loCliente.Pessoa);
            }
            return loListaPessoa;
        }


    }
}
